<?php
require_once("{$CfgPara->root}/class/user_operate.class.php");
require_once("{$CfgPara->root}/class/mysql.func.php");
require_once("{$CfgPara->root}/class/make_img_name.class.php");

/**
 * user 用户数据模型
 *
 * @version 1.0
 * @author Human
 */
class user_m
{
    /**
     * 信息类型 地区
     */
    const MsgArea = 2;
    /**
     * 信息类型 性别
     */
    const MsgSex = 3;
    /**
     * 信息类型 生日
     */
    const MsgBirthday = 4;
    /**
     * 信息类型 密码
     */
    const MsgPassword = 5;
    /**
     * 密码校验正则表达式 仅大小写字母 数字0-9 长度6~16
     */
    const RegPassword = '/[a-zA-Z0-9]{6,16}/';
    /**
     * 用户名校验正则表达式 英文、中文、数字、下划线2到12长度
     */
    const RegUsername = '/^[\w\_\x{4e00}-\x{9fa5}]{2,12}$/u';
    /**
     * 列表类型 搜索用户
     */
    const ListSearch = 1;
    /**
     * 列表类型 用户管理
     */
    const ListManage = 2;
    /**
     * 列表类型 用户搜索
     */
    const ListManageS = 3;

    /**
     * 列表类型 我的收藏
     */
    const ListMyCollect = 7;

    /**
     * 获取用户列表时 如果设置了计算总数
     * 则为总数量，如果没设置为-1 如果计算时错误为-2
     */
    public $user_list_count;

    public function __construct($dbPara = null)
    {
        if ($dbPara != null) {
            db_connect($dbPara);
        }
    }

    /**
     * 获取所有用户的数量 错误返回错误信息
     */
    public function user_count()
    {
        $sql_str = "SELECT COUNT(1) as NUM FROM users";
        $result = db_query($sql_str);
        if ($result != false) {
            if ($count = $result->fetch_object()) {
                return $count->NUM;
            } else {
                return '无法获取用户数量';
            }
        } else {
            return db_error();
        }
    }

    /**
     * 获取今日新增的用户的数量 错误返回错误信息
     */
    public function user_today_count()
    {
        //获取当前日期
        $cur_d = date('Y-m-d');

        $sql_str = "SELECT COUNT(1) as NUM FROM users 
                    WHERE JoinDt >= '{$cur_d} 00:00:00' AND 
                          JoinDt <= '{$cur_d} 23:59:59'";
        $result = db_query($sql_str);
        if ($result != false) {
            if ($count = $result->fetch_object()) {
                return $count->NUM;
            } else {
                return '无法获取今日新增用户数量';
            }
        } else {
            return db_error();
        }
    }

    /**
     * 获取用户列表
     */
    public function user_list($type, $id, $page, $page_size, $search = null, $count = false)
    {
        if (!is_numeric($type) || !is_numeric($id) || !is_numeric($page) || !is_numeric($page_size)) {
            return "错误:作者列表查询信息错误";
        }
        $limit_count = $page_size;
        $limit_offset = ($page - 1) * $page_size;//计算偏移量
        if ($search != null && is_string($search))  //加入全文检索语句
        {
            $search_text = urldecode($search);
            $search_text = db_escape($search_text);
            if (mb_strlen($search_text) < 2) {
                return "搜索文本长度应大于1";
            }
            if (!empty ($search_text)) {
                $search_sql = "WHERE MATCH (`users`.`Keyword`,`users`.`Province`,`users`.`Name`,`users`.`City`) 
                               AGAINST ('{$search_text}')";
            } else {
                $search_sql = '';
            }
        } else {
            $search_sql = '';
        }
        if ($count === true) //同时计算检索总数 而不受limit影响
        {
            $found_rows_sql = 'SQL_CALC_FOUND_ROWS';
        } else {
            $this->user_list_count = -1;
            $found_rows_sql = '';
        }
        if ($type == user_m::ListSearch ||
            $type == user_m::ListManage
        ) //20170206 添加 管理员管理用户列表 当前与搜索的sql语句一致
        {
            $sql_str = "SELECT {$found_rows_sql} * FROM `users` {$search_sql}";
        } elseif ($type == user_m::ListMyCollect) {
            $sql_str = "SELECT {$found_rows_sql} `users`.* 
                        FROM `users`,`user_collect` 
                        WHERE `users`.`Id` = `user_collect`.`CollectId` AND 
                              `user_collect`.`UserId` = {$_SESSION['user_id']} AND 
                              `user_collect`.`Type` = 2 ";
            if (!empty ($search_text)) {
                $sql_str .= "AND MATCH (`users`.`Keyword`,`users`.`Province`,`users`.`Name`,`users`.`City`) 
                             AGAINST ('{$search_text}')";
            }
        }
        $sql_str .= " LIMIT {$limit_offset},{$limit_count}";
        $result_sql = db_query($sql_str);
        if ($result_sql instanceof mysqli_result) {
            $fetch_result = db_fetch_list($result_sql, $rows);
            if ($count === true) {
                $found_count = db_query('SELECT FOUND_ROWS()');
                if ($found_count !== false) {
                    $this->user_list_count = $found_count->fetch_array()[0];
                } else {
                    $this->user_list_count = -2;
                }
            }
            return $rows;
        } else {
            return db_error();
        }
    }

    /**
     * 个人资料信息保存 正确返回'1' 错误返回错误信息
     * @param mixed $data 上传的数据
     * @param mixed $type 信息保存 参考本类常量
     * @param mixed $user_id 当前用户Id
     * @return mixed
     */
    public function user_msg_save($data, $type, $user_id)
    {
        $update = array();
        $error_msg = '个人资料保存时，资料信息不正确';
        if (!is_numeric($user_id) || !is_numeric($type)) return $error_msg;
        if ($type == user_m::MsgArea) {
            if (!isset($data['Province']) || !isset($data['City'])) return $error_msg;
            $update['Province'] = urldecode($data['Province']);
            $update['City'] = urldecode($data['City']);
        } elseif ($type == user_m::MsgSex) {
            if (!isset($data['Sex']) || !is_numeric($data['Sex'])) return $error_msg;
            $update['Sex'] = $data['Sex'];
        } elseif ($type == user_m::MsgBirthday) {
            if (!isset($data['Birthday'])) return $error_msg;
            $update['Birthday'] = db_escape($data['Birthday']);
        } elseif ($type == user_m::MsgPassword) {
            if (!isset($data['OldPassword']) || !isset($data['Password'])) return $error_msg;
            $old_password = md5($data['OldPassword']);
            //检测原密码是否正确
            $user_check = db_query("SELECT `Name` FROM `users` WHERE `Id` = {$user_id} AND `Password` = '{$old_password}'");
            if ($user_check instanceof mysqli_result) {
                if ($user_check->num_rows > 0) {
                    if (preg_match(user_m::RegPassword, $data['Password'])) //检测新密码是否符合规则
                    {
                        $update['Password'] = md5($data['Password']);
                    } else {
                        return '修改密码时，新密码不符合规则';
                    }
                } else {
                    return '密码修改时，原密码不正确';
                }
            } else {
                return db_error();
            }
        }
        $sql_str = "UPDATE `users` SET ";
        foreach ($update as $k => $v) {
            $sql_str .= "`$k` = '$v',";
        }
        $sql_str = rtrim($sql_str, ',') . " WHERE `Id` = '{$user_id}'";
        $result1 = db_query($sql_str);
        if ($result1 === true) {
            return '1';
        } else {
            return db_error();
        }
    }

    /**
     * 用户保存头像 正确返回1 错误返回错误信息
     * @param string $file 头像的完整文件名
     * @param string $file_url 头像的访问url（含http等信息）
     * @param int $user_id 当前用户id
     * @return string
     */
    public function user_avatar_save($file, $file_url, $user_id)
    {
        if (!is_numeric($user_id)) return '保存头像时，用户信息错误';
        if ($_SESSION['user_id'] != $user_id) {
            // 如果修改的不是本人头像 需要管理员权限 且以管理员身份登陆
            if (isset ($_SESSION['user_level']) && $_SESSION['user_level'] >= 90 &&
                isset ($_SESSION['user_admin']) && $_SESSION['user_admin'] == 1
            ) {
            } else {
                return '无权限修改此头像';
            }
        }

        if (file_exists($file)) {
            $result = db_query("UPDATE `users` SET `Avatar` = '{$file_url}' WHERE `Id` = {$user_id}");
            if ($result === true) {
                return 1;
            } else {
                @unlink($file);
                return db_error();
            }
        } else {
            return '保存头像时，未找到头像文件';
        }

    }

    public function get_sex_text($sex)
    {
        if ($sex == 1) {
            return '男';
        } elseif ($sex == 2) {
            return '女';
        } else {
            return '保密';
        }
    }

    /**
     * 本站用户登录 正确返回用户Id、Name、Avatar、Level的数组 不存在返回false 失败返回失败信息
     * @param mixed $user_name 用户名
     * @param mixed $password 密码
     * @return mixed
     */
    public function user_local_login($user_name, $password)
    {
        $user_c = urldecode($user_name);
        $user_c = db_escape($user_c);
        if ($user_c === false) return false;
        $pMd5 = urldecode($password);
        $pMd5 = md5($pMd5);
        $sql_s = "SELECT `Id`,`Avatar`,`Level`,`State` FROM `users` WHERE `Name` = '{$user_c}' AND `Password` = '{$pMd5}' AND `ThirdPlatform` = 0 AND `ThirdUid` = 0";
        $result = db_query($sql_s);
        if ($result !== false) {
            if ($result->num_rows > 0) {
                if ($return = $result->fetch_assoc()) {
                    if ($return['State'] == -1)
                        return '此用户已被封停';
                    $return['Name'] = $user_name;
                    //20170128 添加 如果当前对话为只允许管理员登陆 需要检查用户的权限
                    if (isset($_SESSION['user_admin']) &&
                        $return['Level'] < 90
                    ) //用户权限为非管理员 返回登陆失败
                    {
                        return '此用户无管理员权限';
                    }
                    if (isset($_SESSION['user_admin'])) //管理员登陆后 将此对话设置为值1
                    {
                        $_SESSION['user_admin'] = 1;
                    }
                    return $return;
                } else {
                    return '请检查用户名或密码';
                }
            } else {
                return '请检查用户名或密码';
            }

        } else {
            //return $result;
            return db_error();
        }
    }

    /**
     * 用户微博登陆 成功返回用户Id、Name、Avatar的数组 false表示当前用户名未登陆过 需要在本地注册
     * @param array $user_msg 用户信息
     * @return bool|string
     */
    public function user_weibo_login($user_msg)
    {
        if (!isset($user_msg['id']) || !isset($user_msg['screen_name']) ||
            !isset($user_msg['profile_image_url']) || !isset($user_msg['location'])
        )
            return '获取微博的用户信息错误';
        //检查当前微博用户 是否已在本站注册过
        $result1 = db_query("SELECT `Id`,`Name` FROM `users` WHERE `ThirdUid` = {$user_msg['id']} AND `ThirdPlatform` = 1");
        if ($result1 !== false) {
            if ($result1->num_rows > 0) //检测到用户
            {
                //更新用户信息 头像 地区
                if ($this->user_weibo_update($user_msg) === true) {
                    if ($return = $result1->fetch_assoc()) {
                        $return['Avatar'] = db_escape($user_msg['profile_image_url']);
                        return $return;
                    } else {
                        return '更新头像、地区失败2';
                    }
                } else {
                    return '更新头像、地区失败1';
                }
            } else {
                return false;
            }
        } else {
            return db_error();
        }
    }

    /**
     * 更新用户信息 头像 地区
     * @param mixed $user_msg
     * @return bool
     */
    public function user_weibo_update($user_msg)
    {
        $locations = explode(' ', $user_msg['location']);
        if (!isset($locations[0])) $locations[0] = '';
        if (!isset($locations[1])) $locations[1] = '';
        $locations[0] = db_escape($locations[0]);
        $locations[1] = db_escape($locations[1]);
        $avatar = db_escape($user_msg['profile_image_url']);
        $result1 = db_query("UPDATE `users` SET `Avatar` = '{$avatar}',
                                        `Province` = '{$locations[0]}',
                                        `City` = '{$locations[1]}' 
                                        WHERE `ThirdUid` = {$user_msg['id']} AND `ThirdPlatform` = 1");
        if ($result1 === true) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 用户注册 成功返回'1' 失败返回错误信息
     * @param string $user_name 用户名
     * @param string $password 密码
     * @param array $thirdmsg 第三方平台信息
     * @return string
     */
    public function user_reg($user_name, $password = '', $thirdmsg = null)
    {
        if (!preg_match(user_m::RegUsername, $user_name)) //检测用户名是否符合规则
        {
            return '用户名仅支持英文、中文、数字、下划线，2到12长度';
        }
        $user_name = urldecode($user_name);
        $user_name = db_escape($user_name);
        if ($user_name === FALSE) return '用户名不合法';
        if ($this->user_check($user_name)) {
            return '用户名已存在'; //已存在
        } else {
            $pMd5 = '';
            if ($password != '') {
                $password = urldecode($password);
                if (preg_match(user_m::RegPassword, $password)) //检测新密码是否符合规则
                {
                    $pMd5 = md5($password);
                } else {
                    return '用户密码仅支持大小写英文字母，数字0-9，长度6-16';
                }
            }
            //20170111 添加 获取用户名+简介+省+市的分词
            //标签的词汇本身已用空格分好
            //获取的分词用空格分隔后 写入Keyword字段 用于搜索
            global $CfgPara;
            require_once("{$CfgPara->root}/class/keyword_zh.func.php");
            $keyWord = get_keywords($user_name);

            // 第三方平台登陆信息
            if ($thirdmsg != null) {
                if (isset($thirdmsg['id']) && is_numeric($thirdmsg['id']) &&
                    isset($thirdmsg['location']) && isset($thirdmsg['profile_image_url'])
                ) {
                    $locations = explode(' ', $thirdmsg['location']);
                    if (!isset($locations[0])) $locations[0] = '';
                    if (!isset($locations[1])) $locations[1] = '';
                    $locations[0] = db_escape($locations[0]);
                    $locations[1] = db_escape($locations[1]);
                    $avatar = db_escape($thirdmsg['profile_image_url']);
                    $query .= ", `Avatar`='{$avatar}',`Province`='{$locations[0]}',`City`='{$locations[1]}',`ThirdUid`={$thirdmsg['id']},`ThirdPlatform`=1";
                } else {
                    return '提交的用户信息不完整';
                }
            }
            db_begin();
            // 插入用户信息 使用默认头像
            $sql_str = "INSERT INTO `users` 
                        SET `Name` = '{$user_name}' , 
                            `Password` = '{$pMd5}', 
                            `Keyword` = '{$keyWord}',
                            `Avatar` = '{$CfgPara->httproot}/avatar/default.jpg'";
            $result = db_query($sql_str);
            if ($result !== TRUE) return db_rollback();
            $user_id = db_insert_id();
            // 插入查看系统消息时间 时间值自动以当前时间记录
            $sql_str = "INSERT INTO `message_system_user_view` 
                        SET `UserId` = {$user_id}";
            $result = db_query($sql_str);
            if ($result !== TRUE) return db_rollback();

            // 插入各个消息数量统计信息 表自动赋予初始值
            $sql_str = "INSERT INTO `message_count` 
                        SET `UserId` = {$user_id}";
            $result = db_query($sql_str);
            if ($result !== TRUE) return db_rollback();
            db_commit();
            return '1'; //插入成功
        }
    }

    /**
     * 检查用户名是否存在 存在返回true 不存在返回false 失败返回失败信息
     * @param string $user_name 用户名
     * @param mixed $password 密码
     * @return mixed
     */
    public function user_check($user_name, $password = "")
    {
        $user_c = db_escape($user_name);
        if ($user_c === false) return false;

        if ($password == "") {
            $sql_s = "SELECT `Id` FROM `users` WHERE `Name` = '{$user_c}'";
        } else {
            $pMd5 = md5($password);
            $sql_s = "SELECT `Id` FROM `users` WHERE `Name` = '{$user_c}' AND `Password` = '{$pMd5}'";
        }

        $result = db_query($sql_s);
        if ($result instanceof mysqli_result) {
            if ($result->num_rows > 0) {
                return true;
            }
        } else {
            //return $result;
            return db_error();
        }
        return false;
    }

    /**
     * 获取用户信息 正确返回对象，错误返回错误信息
     */
    public function user_msg($userC, $user)
    {
        $result1 = db_query("SELECT * FROM `users` WHERE `{$userC}` = '{$user}'");
        if ($result1 instanceof mysqli_result) {
            if ($result = $result1->fetch_object()) {
                return $result;
            } else {
                return '未获得此用户信息';
            }
        } else {
            return db_error();
        }
    }

    /**
     * 获取用户本领风格的数量
     * 正确返回数值 失败返回错误信息或者-2
     */
    public function user_field_count($user_id)
    {
        if (!is_numeric($user_id)) return '获取本领数量时,用户信息错误';
        $result = db_query("SELECT Count(*) FROM `user_field` WHERE `UserId` = {$user_id}");
        if ($result !== FALSE) {
            if ($row = $result->fetch_array()) {
                return $row[0];
            } else {
                return -2;
            }
        } else {
            return db_error();
        }
    }

    /**
     * 获取用户本领列表 正确返回对象数组，错误返回错误信息
     * @param int $user_id 用户Id
     * @param int $view 前台查询 1是 0否
     */
    public function user_field_list($user_id, $view = 1)
    {
        if (!is_numeric($user_id)) return '获取本领时,用户信息错误';
        if ($view == 0) // 后台查询 
            $fieldNameC = 'FieldName2';
        else
            $fieldNameC = 'FieldName';
        // 首先按Order排序 然后按插入先后顺序排
        $sql_str = "SELECT `Id`, `{$fieldNameC}`, `WorksCount`,`ViewState`
                    FROM `user_field`
                    WHERE `UserId` = {$user_id} ";
        if ($view === 1) // 前台查询列表 前台必须可见 且作品数大于0
            $sql_str .= " AND `WorksCount` > 0 AND `ViewState` = 1";
        $sql_str .= " ORDER BY `Order`, `Id`";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        $field_list = array();
        $sql_str = '';
        while ($row = $result->fetch_object()) {
            $field_list[] = $row;
            if ($view === 0) // 后台查询的话 本领的作品数需要即时查询计算
            {
                $sql_str .= "SELECT COUNT(1) as CValue FROM user_field_works WHERE FieldId = {$row->Id} UNION ALL ";
            }
        }
        if ($view === 0) {
            if ($sql_str == '') return array(); // 如果查询为空 返回个空数组
            $sql_str = substr($sql_str, 0, strlen($sql_str) - 10); //查询语句删除掉最后的'UNION ALL '
            $result = db_query($sql_str);
            if ($result === FALSE) return db_error();
            $i = 0;
            while ($count = $result->fetch_object()) {
                $field_list[$i]->WorksCount2 = $count->CValue;
                $i++;
            }
        }
        return $field_list;
    }

    /**
     * 获取用户本领信息 正确返回对象，错误返回错误信息, 在参数中返回作品信息的对象数组
     * @param int $field_id 本领的id
     * @param array $works_msg 返回作品信息的对象数组
     * @param array $view 1为前台查询 0为后台查询
     */
    public function user_field_msg($field_id, &$works_msg, $view)
    {
        if (!is_numeric($field_id) || !is_array($works_msg)) return '获取本领时,信息错误';
        $sql_str = "SELECT * FROM `user_field` WHERE `user_field`.`Id` = {$field_id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        if ($field_msg = $result->fetch_object()) {
        } else
            return "获取本领信息失败";
        // 获取本领的作品信息
        $sql_str = "SELECT `works`.*, `user_field_works`.`ViewState` FROM `user_field_works`, `works` 
                    WHERE `user_field_works`.`FieldId` = {$field_id} AND 
                          `user_field_works`.`WorkId` = `works`.`Id`";
        if ($view === 1) // 前台查询 只查看view = 1的
            $sql_str .= " AND `user_field_works`.`ViewState` = 1";
        $sql_str .= " ORDER BY `user_field_works`.`Order`";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();

        global $CfgPara;
        $count = 0;
        while ($row = $result->fetch_object()) {
            // 只需要第一张图 前台查询需要迷你图 后台查询需要微型图
            $pic = make_img_name::get_1st_pic_name($row->Picture);
            if ($view === 1)
                $pic = make_img_name::make_img_mini_name($pic);
            else
                $pic = make_img_name::make_img_micro_name($pic);
            $row->Picture = "$CfgPara->httproot/works_pic/$pic";
            $works_msg[] = $row;
            // 如果为后台查询 需要即时查询计算当前的作品数量
            $count++;
        }
        $field_msg->WorksCount = $count;
        return $field_msg;
    }

    /**
     * 用户本领排序 成功返回1 失败返回错误信息
     * @param mixed $ids 本领id的顺序 以逗号分隔
     * @return mixed
     */
    public function user_field_order($ids)
    {
        if (empty($ids)) return '本领排序时，提交的顺序错误';
        $ids = explode(',', rtrim($ids, ','));
        db_begin();
        $order = 0;
        foreach ($ids as $id) {
            if (!is_numeric($id)) {
                db_rollback();
                return '本领排序时，提交的顺序非法';
            }
            $sql_str = "UPDATE `user_field` SET `Order` = {$order} WHERE `Id` = {$id}";
            $result = db_query($sql_str);
            if ($result === FALSE) return db_rollback();
            $order++;
        }
        db_commit();
        return 1;
    }

    /**
     * 用户本领排序 成功返回1 失败返回错误信息
     * @param mixed $ids 本领id的顺序 以逗号分隔
     * @return mixed
     */
    public function user_field_work_order($field_id, $ids)
    {
        if (!is_numeric($field_id)) return '本领的作品排序时，提交的本领信息错误';
        if (empty($ids)) return '本领的作品排序时，提交的顺序错误';
        $ids = explode(',', rtrim($ids, ','));
        db_begin();
        $order = 0;
        foreach ($ids as $id) {
            if (!is_numeric($id)) {
                db_rollback();
                return '本领的作品排序时，提交的顺序非法';
            }
            $sql_str = "UPDATE `user_field_works` SET `Order` = {$order} 
                        WHERE `FieldId` = {$field_id} AND `WorkId` = {$id}";
            $result = db_query($sql_str);
            if ($result === FALSE) return db_rollback();
            $order++;
        }
        db_commit();
        return 1;
    }

    /**
     * 用户收藏检测 已收藏返回true 未收藏返回false 错误返回false
     * @param int $id 收藏内容的id 例如收藏作品 为作品id
     * @param int $type 收藏内容的类型 0作品 1鞋主秀 其它暂无
     * @return bool
     */
    public function user_collect_check($id, $type)
    {
        if (!is_numeric($id) || ($type != 0 && $type != 1)) {
            return '错误: 提交的收藏信息不正确';
        }
        if (!isset($_SESSION['user_id']) || !is_numeric($_SESSION['user_id'])) {
            return false;
        }
        $result1 = db_query("SELECT `UserId` FROM `user_collect` 
                                        WHERE `UserId` = {$_SESSION['user_id']} AND `Type` = {$type} AND `CollectId` = {$id}");
        if ($result1 !== false && $result1->num_rows > 0) {
            return true;
        } else {
            return FALSE;
        }
    }

    /**
     * 用户收藏保存 成功收藏返回1 取消收藏-1 错误返回错误信息
     * @param int $id 收藏内容的id 例如收藏作品 为作品id
     * @param mixed $type 收藏内容的类型 0作品 1鞋主秀 2个人主页 其它暂无
     * @return bool|double|int|string 成功返回1 已经收藏过返回-2 错误返回错误信息
     */
    public function user_collect_save($id, $type)
    {
        if (!is_numeric($id) ||
            ($type != 0 && $type != 1 && $type != 2)
        ) {
            return '错误: 提交的收藏信息不正确';
        }
        if (!isset($_SESSION['user_id'])) {
            return '错误: 请登录';
        }
        if (!is_numeric($_SESSION['user_id'])) {
            return '错误: 用户信息错误';
        }
        $result = 1;
        $update_type = '+';
        db_begin();
        //加入用户收藏表
        $result1 = db_query("INSERT INTO `user_collect` 
                            SET `UserId` = {$_SESSION['user_id']}, `Type` = {$type}, `CollectId` = {$id}");
        if ($result1 !== true) {
            if (db_errno() === 1062) {
                $result = -1;  //已经收藏过
                $update_type = '-';
                $result11 = db_query("DELETE FROM `user_collect` 
                                      WHERE 
                                      `UserId` = {$_SESSION['user_id']} AND 
                                      `Type` = {$type} AND
                                      `CollectId` = {$id}");
                if ($result11 !== true) {
                    return db_rollback();
                }
            } else {
                return db_rollback();
            }
        }
        if ($type == 0) {
            $table_name = 'works';
            $collet_type = user_operate::WorkCollect;
            //更新当前用户收藏他人作品数量
            $result2 = db_query("UPDATE `users` 
                                SET `CollectOtherCount` = `CollectOtherCount` {$update_type} 1 
                                WHERE `Id` = {$_SESSION['user_id']}");
            if ($result2 !== true) return db_rollback();

            //更新作品作者被收藏数量
            $result3 = db_query("UPDATE `users`,`{$table_name}` 
                                SET `users`.`CollegeCount` = `users`.`CollegeCount` {$update_type} 1 
                                WHERE `{$table_name}`.`Author` = `users`.`Id` AND `{$table_name}`.`Id` = {$id}");
            if ($result3 !== true) return db_rollback();
        }
        /* 20170511收藏操作 不记录
        $op = new user_operate();
        $result1 = $op->operate_save($collet_type, $_SESSION['user_id'], $id);
        if ($result1 !== TRUE) {db_rollback(); return $result1;}
        */
        db_commit();
        return $result;
    }

    /**
     * 用户关注 正确返回被关注着的当前关注人数 已关注过返回'-1' 返回关注人数时错误'-2' 错误返回错误信息
     * @param mixed $user_id 被关注者的Id
     * @param mixed $fans_id 关注者(成为粉丝) 的Id
     * @return mixed
     */
    function user_follow($user_id, $fans_id)
    {
        if (!is_numeric($user_id) || !is_numeric($fans_id)) {
            return '错误: 提交的用户信息不正确';
        }
        db_begin();
        $result1 = db_query("INSERT INTO `user_follow` SET `UserId`={$user_id},`FansId`={$fans_id}");
        if ($result1 === false) {
            if (db_errno() === 1062) {
                return '-1';
            }
            return db_rollback();
        }
        //更新当前关注者的关注数
        $result2 = db_query("UPDATE `users` SET `users`.`FollowCount` = `users`.`FollowCount` + 1 WHERE `users`.`Id` = {$fans_id}");
        if ($result2 === false) {
            return db_rollback();
        }
        //更新被关注者的粉丝数 以及推送被关注者的关注消息数
        $result2 = db_query("UPDATE `users`,`message_count` 
                             SET `users`.`FansCount` = `users`.`FansCount` + 1, 
                                 `message_count`.`Follow` = `message_count`.`Follow` + 1,
                                 `message_count`.`AllFollow` = `message_count`.`AllFollow` + 1 
                             WHERE `users`.`Id` = {$user_id} AND `message_count`.`UserId` = {$user_id}");
        if ($result2 === false) {
            return db_rollback();
        }
        //给被关注者的推送消息
        $result4 = db_query("INSERT INTO `message_follow` 
                             SET `Type` = 1,`MsgIdFrom` = {$fans_id},`UserId`={$user_id}");
        if ($result4 === false) {
            return db_rollback();
        }
        db_commit();
        $result3 = db_query("SELECT `FansCount` FROM `users` WHERE `users`.`Id` = {$user_id}");
        if ($result3 !== false) {
            if ($result = $result3->fetch_array())
                return $result[0];
            else
                return -2;
        } else {
            return -2;
        }
    }

    /**
     * 用户主页浏览数计数 正确返回当前计数 错误返回错误信息
     * @param int $user_id
     * @return bool|string
     */
    function user_show_view_count($user_id)
    {
        if (!is_numeric($user_id)) {
            return '错误: 提交的用户主页信息不正确';
        }
        $result = db_query("UPDATE `users` SET `users`.`ShowCount` = `users`.`ShowCount` + 1 WHERE `users`.`Id` = {$user_id}");
        if ($result === true) {
            $result1 = db_query("SELECT `ShowCount` FROM `users` WHERE `users`.`Id` = {$user_id}");
            if ($result1 !== false) {
                if ($result2 = $result1->fetch_array()) {
                    return $result2[0];
                } else {
                    return '返回当前计数时出错';
                }

            } else {
                return db_error();
            }
        } else {
            return db_error();
        }
    }

    /**
     * 用户本领的作品列表查询
     * $type: 1查询可添加的作品 2查询可被删除的作品 3查询可被排序的作品
     * $id: 作品所属的本领id
     */
    function user_work_list($type, $id)
    {
        if (!isset ($type) || !is_numeric($type) ||
            !isset ($id) || !is_numeric($id)
        )
            return '获取作品列表时，提交的信息错误';
        if (!isset ($_SESSION['user_id']) || !is_numeric($_SESSION['user_id']))
            return '获取作品列表时，请先登录';
        // 查询当前本领的所有作品id
        $sql_str = "SELECT `WorkId` FROM `user_field_works` WHERE `FieldId` = {$id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        $ids = '';
        $id_array;
        while ($row = $result->fetch_object()) {
            $ids .= $row->WorkId . ',';
        }
        $ids = rtrim($ids, ','); // 删除掉最后一个逗号
        if ($type == 1) // 用户的本领添加作品
        {
            // 查询用户已发布的作品 且还没加入此本领
            $sql_str = "SELECT `Id`,`Picture` FROM `works` 
                        WHERE `Author` = {$_SESSION['user_id']} AND
                              `State` = 1";
            if ($ids != '') $sql_str .= " AND `Id` NOT IN ({$ids})";
        } else if ($type == 2 || $type == 3) // 用户的本领删除作品
        {
            if (empty ($ids)) return array(); // 代表没查询到本领的作品 返回个空的数组
            // 查询用户已加入当前本领的作品
            $sql_str = "SELECT `Id`,`Picture` FROM `works` 
                        WHERE `Author` = {$_SESSION['user_id']} AND
                              `State` = 1 AND 
                              `Id` IN ({$ids})";
        } else
            return '获取作品列表时，提交的类型错误';
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        global $CfgPara;
        $works_msg = array();
        while ($row = $result->fetch_object()) {
            // 只需要第一张图的微型图
            $pic = make_img_name::get_1st_pic_name($row->Picture);
            $pic = make_img_name::make_img_micro_name($pic);
            // 检查图片是否存在
            if (file_exists("{$CfgPara->root}/works_pic/{$pic}")) {
                $pic = "{$CfgPara->httproot}/works_pic/{$pic}";
                $row->Picture = $pic;
                $works_msg[] = $row;
            }
        }
        return $works_msg;
    }

    /**
     * 删除本领 成功返回1，失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $field_id 本领Id
     * @param int $update_count 是否更新用户的本领数 1更新 0以后再统一更新
     */
    function user_field_dele($field_id, $update_count = 0)
    {
        if (!is_numeric($field_id)) {
            return '删除本领时,提交的本领信息错误';
        }
        // 删除当前用户下的本领
        $sql_str = "DELETE FROM `user_field` 
		            WHERE `Id` = {$field_id} AND 
		                  `UserId` = {$_SESSION['user_id']}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        if (db_affected_rows() <= 0) return '删除本领时,没有找到当前用户的本领';

        //删除本领中的作品信息
        $sql_str = "DELETE FROM `user_field_works` 
		            WHERE `FieldId` = {$field_id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();

        if ($update_count === 1) {
            //更新当前用户的本领数
            $sql_str = "UPDATE `users` 
                        SET `FieldCount` = `FieldCount` - 1
                        WHERE `Id` = {$_SESSION['user_id']}";
            $result = db_query($sql_str);
            if ($result === FALSE) return db_error();
        }
        return 1;
    }

    /**
     * 更新用户的本领数量 类型0为减 类型1为加 成功返回1 失败返回错误信息
     */
    public function user_field_update_count($type, $value)
    {
        if ($type == 0) $flag = '-'; // 减少
        elseif ($type == 1) $flag = '+';
        else return '更新用户本领数量时,类型错误';
        $sql_str = "UPDATE `users` SET `FieldCount` = `FieldCount` {$flag} {$value}
					WHERE `Id` = {$_SESSION['user_id']}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        return 1;
    }

    /**
     * 检查本领是否属于指定用户 属于返回1，其它返回错误信息
     * @param int $id 本领id
     * @param int $user_id 用户id
     * @param object $fieldMsg 返回查询到的本领信息
     */
    function user_field_own_check($id, $user_id, &$fieldMsg)
    {
        // 根据id查询本领
        $sql_str = "SELECT `Id`,`UserId`,`FieldName`,`ViewState`,`PayCarId` FROM `user_field` 
                    WHERE `Id` = {$id} FOR UPDATE";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        if ($result->num_rows <= 0) {
            return '未找到提交的本领信息';
        }
        if ($fieldMsg = $result->fetch_object()) {
            if ($fieldMsg->UserId != $_SESSION['user_id']) {
                return '提交的本领不属于当前用户';
            }
        } else {
            return '未找到提交的本领信息';
        }
        return 1;
    }

    /**
     * 检查提交的作品是否属于当前用户 正确返回1 错误返回字符串信息
     * @param string $ids 作品id字符串 逗号分隔
     * @param array $work_list 返回作品信息
     * @param get_paycar 是否获取在购物车中的id 0否 传入本领的id 通过$work_list返回PayCarId
     */
    function user_field_work_check(&$ids, &$work_list, $get_paycar = 0)
    {
        $ids = rtrim($ids, ',');
        $id_array = explode(',', $ids);
        // 检查提交的id是否为数值
        foreach ($id_array as $id) {
            if (!is_numeric($id)) return '提交的作品信息非法';
        }
        // 检查提交的作品是否属于当前用户
        if ($get_paycar == 0) {
            $sql_str = "SELECT `Id`,`Name`,`Author`,`State` FROM `works`
                        WHERE `Id` IN ({$ids})";
        } else {
            $sql_str = "SELECT `works`.`Id`,`works`.`Name`,`works`.`Author`,`works`.`State`, 
                               `user_field_works`.`PayCarId`,`user_field_works`.`ViewState`
                        FROM `works`, `user_field_works`
                        WHERE `works`.`Id` IN ({$ids}) AND 
                              `works`.`Id` = `user_field_works`.`WorkId` AND
                              `user_field_works`.`FieldId` = {$get_paycar}";
        }
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        while ($row = $result->fetch_object()) {
            if ($row->State != 1) return '提交的作品为草稿';
            if ($row->Author != $_SESSION['user_id']) return '提交的作品不属于用户';
            $work_list[] = $row;
        }
        return 1;
    }

    /**
     * 本领更新 成功返回本领的id 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $id 本领的id
     * @param string $name 本领的名称
     * @param string $introd 本领的简介
     * @param int $view 前台是否可见 1可见 0不可见 10仅更新后台数据
     * @param object $msg 返回当前本领的名称与简介
     */
    function user_field_update($id, $name, $introd, $view, &$msg = null)
    {
        if (!isset($_SESSION["user_id"]) || !is_numeric($_SESSION["user_id"]))
            return "错误:请登录";
        if (!is_numeric($id)) return '更新本领时，提交的信息错误';
        // 本函数不使用事务 ，由调用此函数的上层统一使用事务
        // db_begin();
        // 根据id查询本领
        $sql_str = "SELECT `Id`,`UserId`,`ViewState`,`FieldName`,`FieldIntrod` FROM `user_field` 
                    WHERE `Id` = {$id} FOR UPDATE";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_rollback();
        if ($result->num_rows <= 0) {
            return '更新本领时，未找到相关本领';
        }

        $msg = $result->fetch_object();
        $pre_view_state = $msg->ViewState;

        if ($msg->UserId != $_SESSION['user_id']) {
            return '更新本领时，不能更新他人本领';
        }

        if ($view === 10) // 仅更新后台数据
        {
            $fieldNameC = 'FieldName2';
            $fieldIntrodC = 'FieldIntrod2';
        } else {
            $fieldNameC = 'FieldName';
            $fieldIntrodC = 'FieldIntrod';
        }

        // 更新本领内容
        $sql_str = "UPDATE `user_field` SET ";
        if (!empty($name)) // 更新本领名称
        {
            $name = urldecode($name);
            $name = db_escape($name);
            if ($name === FALSE) {
                return '提交的本领名称不合法';
            }
            $tLen = mb_strlen($name, 'utf8');
            if ($tLen < 3 || $tLen > 30) {
                return '本领的名称长度必须大于等于3小于30';
            }
            $sql_str .= "`{$fieldNameC}` = '{$name}'";
        }
        if (!empty ($introd)) //更新本领简介
        {
            $introd = urldecode($introd);
            $introd = db_escape($introd);
            if ($introd === FALSE) {
                return '提交的本领简介不合法';
            }
            $tLen = mb_strlen($introd, 'utf8');
            if ($tLen < 5 || $tLen > 128) {
                return '本领的简介长度必须大于等于5小于128';
            }
            if (!empty($name)) $sql_str .= ' , ';
            $sql_str .= "`{$fieldIntrodC}` = '{$introd}' ";
        }
        if ($view === 0 || $view === 1) {
            if (!empty ($name) || !empty ($introd)) $sql_str .= ' , ';
            $sql_str .= "`ViewState` = {$view}"; // 更新可见性
        }
        $sql_str .= " WHERE `Id` = {$id}";
        $result = db_query($sql_str);
        if ($result !== TRUE) return db_error();

        // 如果从不可见变为可见 则增加用户的本领数量
        if ($view === 1 && $pre_view_state == 0) {
            $sql_str = "UPDATE `users` 
                        SET `FieldCount` = `FieldCount` + 1
                        WHERE `Id` = {$_SESSION['user_id']}";
            $result = db_query($sql_str);
            if ($result !== TRUE) return db_error();
        }
        // db_commit();

        return $id;
    }

    /**
     * 新增本领 成功返回新本领的id 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param string $name 本领的名称
     * @param string $introd 本领的简介
     * @param int $view 前台是否可见 1可见 0不可见
     * @param int $pay_car_id 插入购物车时生成的id
     */
    function user_field_insert($name, $introd, $view, $pay_car_id)
    {
        if (!is_numeric($pay_car_id)) return '插入的购物车信息错误';
        $name = urldecode($name);
        $name = db_escape($name);
        if ($name === FALSE) {
            return '提交的本领信息不合法';
        }
        $tLen = mb_strlen($name, 'utf8');
        if ($tLen < 3 || $tLen > 30) {
            return '本领的名称长度必须大于等于3小于30';
        }

        $introd = urldecode($introd);
        $introd = db_escape($introd);
        if ($introd === FALSE) {
            return '提交的本领简介不合法';
        }
        $tLen = mb_strlen($introd, 'utf8');
        if ($tLen < 5 || $tLen > 128) {
            return '本领的简介长度必须大于等于5小于128';
        }
        // 本函数不使用事务 ，由调用此函数的上层统一使用事务
        // db_begin();
        // 新插入的本领在最后面 排序设置为9999 插入时 后台与前台的名称和简介是一样的
        $result = db_query("INSERT INTO `user_field` 
                                        SET `FieldName` = '{$name}', 
                                            `FieldIntrod` = '{$introd}',
                                            `FieldName2` = '{$name}', 
                                            `FieldIntrod2` = '{$introd}',
                                            `UserId` = {$_SESSION['user_id']},
                                            `Order` = 9999,
                                            `PayCarId` = {$pay_car_id}");
        if ($result !== TRUE) return db_error();
        $field_id = db_insert_id();
        if ($view === 1) // 如果是直接可见 则代表已付费成功 更新用户的本领数量
        {
            $sql_str = "UPDATE `users` 
                        SET `FieldCount` = `FieldCount` + 1
                        WHERE `Id` = {$_SESSION['user_id']}";
            $result = db_query($sql_str);
            if ($result !== TRUE) return db_error();
        }
        // db_commit();
        return $field_id;
    }

    /**
     * 将本领设置为前台可显示 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $id 本领id
     * @param int $update_count 是否更新用户的本领数 1是 0不在此处更新
     */
    public function user_field_set_show($id, $update_count = 0)
    {
        if (!is_numeric($id) || !is_numeric($update_count))
            return '本领更新为前台显示时，提交的信息错误';
        $sql_str = "UPDATE `user_field` 
                    SET `ViewState` = 1, 
                        `PayCarId` = null
                    WHERE `Id` = {$id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        if ($update_count === 1) {
            $sql_str = "UPDATE `users` SET `FieldCount` = `FieldCount` + 1 
                        WHERE `Id` = {$_SESSION['user_id']}";
            $result = db_query($sql_str);
            if ($result === FALSE) return db_error();
        }
        return 1;
    }

    /**
     * 更新本领的名称 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $id 本领添加时的购物车id
     */
    public function user_field_update_name($id)
    {
        if (!is_numeric($id)) return '本领更新名称时，提交的信息错误';
        $sql_str = "UPDATE `user_field` 
                    SET `FieldName` = `FieldName2`
                    WHERE `Id` = {$id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        return 1;
    }

    /**
     * 更新本领的简介 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $id 本领添加时的购物车id
     */
    public function user_field_update_introd($id)
    {
        if (!is_numeric($id)) return '本领更新名称时，提交的信息错误';
        $sql_str = "UPDATE `user_field` 
                    SET `FieldIntrod` = `FieldIntrod2`
                    WHERE `Id` = {$id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        return 1;
    }

    /**
     * 本领中的作品添加 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $field_id 本领Id
     * @param int $work_id 作品id
     * @param int $view 前台是否可见 1可见 0不可见
     */
    public function user_field_workadd($field_id, $work_id, $view, $pay_car_id)
    {
        if (!is_numeric($field_id)) return '本领添加作品时，提交的本领信息错误';
        if (!is_numeric($work_id)) return '本领添加作品时，提交的作品信息错误';
        // 本函数不使用事务 ，由调用此函数的上层统一使用事务
        // db_begin();
        // 插入或更新作品
        $sql_str = "INSERT INTO `user_field_works` 
                    SET `WorkId` = {$work_id},  
                        `FieldId` = {$field_id},
                        `UserId` = {$_SESSION['user_id']},
                        `ViewState` = {$view},
                        `PayCarId` = {$pay_car_id}";
        $result = db_query($sql_str);
        if ($result !== TRUE) {
            if (db_errno() === 1062) return '作品已加入过此本领';
            return db_error();
        }
        // db_commit();
        return 1;
    }

    /**
     * 本领中的作品删除 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $field_id 本领Id
     * @param int $work_id 作品id
     */
    public function user_field_workdele($field_id, $work_id)
    {
        if (!is_numeric($field_id)) return '本领删除作品时，提交的本领信息错误';
        if (!is_numeric($work_id)) return '本领删除作品时，提交的作品信息错误';

        $sql_str = "DELETE FROM `user_field_works` 
                    WHERE `FieldId` = {$field_id} AND
                          `WorkId` = ({$work_id})";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        return 1;
    }

    /**
     * 本领中的作品更新为前台显示 成功返回1 失败返回错误信息
     * 本函数不使用事务 ，由调用此函数的上层统一使用事务
     * @param int $field_id 本领Id
     * @param int $work_id 作品id
     * @param int $update_count 是否更新本领中的作品计数 1是 0不在此处更新
     */
    public function user_field_work_set_show($field_id, $work_id, $update_count = 0)
    {
        if (!is_numeric($field_id)) return '本领作品更新为前台显示时，提交的本领信息错误';
        if (!is_numeric($work_id)) return '本领作品更新为前台显示时，提交的作品信息错误';
        $sql_str = "UPDATE `user_field_works` 
                    SET `ViewState` = 1,
                        `PayCarId` = null
                    WHERE `FieldId` = {$field_id} AND 
                            `WorkId` = {$work_id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();

        if ($update_count === 1) {
            $result = $this->user_field_work_update_count($field_id, 1, 1);
            if ($result !== 1) return $result;
        }
        return 1;
    }

    /**
     * 更新用户本领中的作品数量 类型0为减 类型1为加 成功返回1 失败返回错误信息
     */
    public function user_field_work_update_count($field_id, $type, $value)
    {
        if ($type == 0) $flag = '-'; // 减少
        elseif ($type == 1) $flag = '+';
        else return '更新用户本领的作品数量时,类型错误';
        $sql_str = "UPDATE `user_field` SET `WorksCount` = `WorksCount` {$flag} {$value}
					WHERE `Id` = {$field_id}";
        $result = db_query($sql_str);
        if ($result === FALSE) return db_error();
        return 1;
    }

    /**
     * 用户封停 封停返回用户id的负值 解封返回用户id的正值 错误返回错误信息
     * @param int $user_id 用户Id
     * @param int $state 封停状态 0解封 -1封停
     */
    public function user_stop($user_id, $state)
    {
        if (!is_numeric($user_id)) {
            return '提交的用户信息错误';
        }
        if ($state != 0 && $state != -1) {
            return '设置的封停状态不正确 ' . $state;
        }
        if (!isset($_SESSION['user_admin']) && $_SESSION['user_admin'] != 1 &&
            !isset($_SESSION['user_level']) && $_SESSION['user_level'] < 90
        ) {
            return '无封停用户权限';
        }
        if ($_SESSION['user_id'] == $user_id) {
            return '不能封停自己';
        }
        $sql_str = "UPDATE `users` 
                    SET `State` = {$state} 
                    WHERE `Id` = {$user_id}";
        $result = db_query($sql_str);
        if ($result != false) {
            if (db_affected_rows() <= 0) //未对数据库产生更新操作 影响的行数为0
            {
                return '未找到需要封停的用户';
            }
            if ($state == -1) {
                return $user_id * -1;
            } else {
                return $user_id;
            }
        } else {
            return db_error();
        }
    }

}
